home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 June: Reference Library / Dev.CD Jun 00 RL Disk 1.toast / pc / technical documentation / develop / develop issue 26 / develop issue 26 code / qt conferencing code / watcher & 'caster / casting.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-26  |  11.4 KB  |  435 lines

  1. /*********************************************************/
  2. /*  casting.c                                            */
  3. /*  Contains QuickTime Conferencing specific stuff       */
  4. /*********************************************************/
  5.  
  6. #include "caster.h"
  7. #include "casting.h"
  8. #include "shared.h"
  9.  
  10. /* Local Prototypes **************************************/
  11. ComponentResult HandleConferenceEvent ( CastRecord* cr, MTConferenceEventPtr confEvent );
  12. ComponentResult DoConferenceReady(CastRecord* cr, MTConferenceEventPtr confEvent);
  13. ComponentResult DoIncomingCall( CastRecord* cr, MTConferenceEventPtr confEvent );
  14. ComponentResult DoConferenceTerminated(CastRecord* cr, MTConferenceEventPtr confEvent);
  15. ComponentResult DoMemberReady(CastRecord* cr, MTConferenceEventPtr confEvent);
  16.  
  17. pascal Boolean     MyControllerActionFilter(MTControllerComponent mtc, MTControllerActionType action, void *params, long refCon);
  18.  
  19. /* Globals ***********************************************/
  20. MTControllerActionFilterUPP    actionFilterUPP = NewMTControllerActionFilterProc(MyControllerActionFilter);
  21. Boolean                        aTrue = true;
  22. Boolean                        aFalse = false;
  23.  
  24. /*************************************************** 
  25.  OpenCast 
  26. ****************************************************/
  27. ComponentResult    OpenCast( WindowPtr window, SeqGrabComponent sg, CastRecord** cr ) {
  28.     ComponentResult err = noErr;
  29.     CastRecord*        newRecord = nil;
  30.     Point            origin = {0,0};
  31.     Rect            bounds = { 0, 0, 120 + 16, 160 };
  32.  
  33.     newRecord = (CastRecord*)NewPtrClear(sizeof (CastRecord));
  34.  
  35.     if (newRecord == nil)
  36.         err = MemError();
  37.         
  38.     if (err == noErr) {
  39.         newRecord->window = window;
  40.         newRecord->sg = sg;    
  41.         }
  42.  
  43.     if (err == noErr) {
  44.         newRecord->director = OpenDefaultComponent(kMTSourceStreamDirectorType, SeqGrabComponentType);
  45.         if ( newRecord->director == nil)
  46.             err = couldntGetRequiredComponent;
  47.         }
  48.  
  49.     if (err == noErr) {
  50.         newRecord->controller = OpenDefaultComponent( kMTControllerType, kMTMovieTalkSubType );    
  51.         if ( newRecord->controller == nil)
  52.             err = couldntGetRequiredComponent;
  53.         }
  54.     
  55.     if (err == noErr)
  56.         err = MTControllerSetActionFilter(newRecord->controller, actionFilterUPP, 0);
  57.  
  58.     if (err == noErr)
  59.         err = MTDirectorSetMediaComponent( newRecord->director, sg );
  60.  
  61.     if (err == noErr)
  62.         err = MTControllerNewAttachedController(newRecord->controller, newRecord->director, window, origin);    
  63.         
  64.     if (err == noErr)    
  65.         err = MTControllerDoAction( newRecord->controller, mtControllerActionSetShowSnapshot, &aFalse );
  66.  
  67.     if (err == noErr)
  68.         err = MTControllerSetControllerBoundsRect(newRecord->controller, &bounds );
  69.  
  70.     if (err == noErr)    
  71.         *cr = newRecord;
  72.     else
  73.         CloseCast( newRecord );    
  74.     
  75.     return err;
  76. }
  77.  
  78. /*************************************************** 
  79.  CloseCast 
  80. ****************************************************/
  81. ComponentResult CloseCast( CastRecord* cr ) {
  82.  
  83.     ComponentResult err = noErr;
  84.     
  85.     StopCasting( cr );
  86.     
  87.     if (cr->controller)
  88.         CloseComponent(cr->controller);
  89.  
  90.     if (cr->controller)
  91.         CloseComponent(cr->director);
  92.  
  93.     DisposePtr( (Ptr)cr);
  94.     
  95.     err = MemError();
  96.     
  97.     return err;
  98. }
  99.  
  100. /*************************************************** 
  101.  StartCasting 
  102. ****************************************************/
  103. ComponentResult StartCasting( CastRecord* cr, Str63 name ) {
  104.     
  105.     MTCString63        cName;
  106.     ComponentResult err = noErr;
  107.     
  108.     PToCString( name, cName);    
  109.  
  110.     cr->confComponent = OpenDefaultComponent(kMTConferenceType, kMTMovieTalkSubType);
  111.     
  112.     if ( cr->confComponent == nil)
  113.         err = couldntGetRequiredComponent;
  114.     
  115.     if (err == noErr)
  116.         err = MTConferenceSetMode(cr->confComponent, mtSendMediaModeMask+mtShareableModeMask);
  117.     
  118.     if (err == noErr)
  119.         err = MTConferenceListen(cr->confComponent, cName, cName, (MTCString)"mtlkatlk\tMulticaster\x0D");
  120.  
  121.     if (err == noErr)
  122.         cr->casting = true;
  123.         
  124.     return err;
  125. }
  126.  
  127. /*************************************************** 
  128.  IsCastEvent 
  129. ****************************************************/
  130. Boolean IsCastEvent( CastRecord* cr, EventRecord* theEvent ) {
  131.  
  132.     ComponentResult result =  MTControllerIsControllerEvent (cr->controller, theEvent );
  133.     
  134.     return result;
  135. }
  136.  
  137. /*************************************************** 
  138.  CheckCast 
  139. ****************************************************/
  140. ComponentResult CheckCast( CastRecord* cr ) {
  141.  
  142.     ComponentResult err = noErr;
  143.     MTConferenceEvent confEvent;
  144.     
  145.     if (cr->confComponent)
  146.         if( MTConferenceGetNextEvent( cr->confComponent, &confEvent ) )
  147.             err = HandleConferenceEvent(cr, &confEvent);
  148.     
  149.     return err;
  150. }
  151.  
  152. /*************************************************** 
  153.  HandleConferenceEvent 
  154. ****************************************************/
  155. ComponentResult HandleConferenceEvent ( CastRecord* cr, MTConferenceEventPtr confEvent ) {
  156.  
  157.     ComponentResult err = noErr;
  158.     
  159.     /* like a user event handler, we switch on the different conference events */
  160.     switch(confEvent->what){
  161.  
  162.         case mtConferenceReadyEvent:
  163.             err = DoConferenceReady(cr, confEvent);
  164.             break;
  165.         
  166.         case mtIncomingCallEvent:
  167.             err = DoIncomingCall( cr, confEvent );
  168.             break;
  169.             
  170.         case mtConferenceTerminatedEvent:
  171.             err = DoConferenceTerminated(cr, confEvent);
  172.             break;
  173.  
  174.         case mtMemberReadyEvent:
  175.             err = DoMemberReady(cr, confEvent);
  176.             break;
  177.         
  178.         case mtFailedEvent:
  179.             err = confEvent->err;
  180.             break;
  181.             
  182.         default:
  183.             /* ignore all others */
  184.             break;
  185.         }
  186.     
  187.     if(confEvent->surprise)
  188.         DisposeHandle(confEvent->surprise);
  189.         
  190.     return err;
  191. }
  192.  
  193. /*************************************************** 
  194.  DoConferenceReady 
  195. ****************************************************/
  196. ComponentResult DoConferenceReady(CastRecord* cr, MTConferenceEventPtr confEvent) {
  197.  
  198.     ComponentResult err = noErr;
  199.  
  200.     if (cr->conference != 0)
  201.         err = MTConferenceMerge(cr->confComponent, cr->conference, confEvent->who);
  202.     else {
  203.         cr->conference = confEvent->who;
  204.         err = MTConferenceActivateConference(cr->confComponent, cr->conference, cr->controller);
  205.         }
  206.     
  207.     return err;
  208. }
  209.  
  210. /*************************************************** 
  211.  DoIncomingCall 
  212. ****************************************************/
  213. ComponentResult DoIncomingCall( CastRecord* cr, MTConferenceEventPtr confEvent ) {
  214.  
  215.     ComponentResult err = noErr;
  216.     
  217.     err = MTConferenceReply(cr->confComponent, confEvent->who, 0);    
  218.  
  219.     return    err;
  220. }
  221.  
  222. /*************************************************** 
  223.  DoConferenceTerminated 
  224. ****************************************************/
  225. ComponentResult DoConferenceTerminated(CastRecord* cr, MTConferenceEventPtr confEvent) {
  226.  
  227.     ComponentResult err = noErr;
  228.  
  229.     if (cr->conference == confEvent->who) {
  230.         cr->conference = 0;
  231.         MTControllerDoAction(cr->controller, mtControllerActionPlay, &aTrue);
  232.         }
  233.         
  234.     return err;
  235. }
  236.  
  237. /*************************************************** 
  238.  DoMemberReady 
  239. ****************************************************/
  240. ComponentResult DoMemberReady(CastRecord* cr, MTConferenceEventPtr confEvent) {
  241.  
  242.     ComponentResult err = noErr;
  243.  
  244.     err = MTConferenceActivateMember(cr->confComponent, confEvent->who, 0);
  245.     
  246.     if (err == noErr)
  247.         err = MTConferenceDetachMember(cr->confComponent, confEvent->who);
  248.     
  249.     return err;
  250. }
  251.  
  252. /***************************************************
  253. CastChangedWindow
  254. ****************************************************/
  255. /* this little gem is needed to tell the sequence grabber 
  256.    when a window has been moved */
  257. ComponentResult CastChangedWindowBefore( CastRecord* cr, Boolean finished ) {
  258.     
  259.     ComponentResult err = noErr;
  260.     
  261.     err = MTDirectorChangedWindow(cr->director, finished);
  262.     
  263.     return err;
  264. }
  265.  
  266. /*************************************************** 
  267.  StopCasting 
  268. ****************************************************/
  269. ComponentResult StopCasting(  CastRecord* cr  ) {
  270.  
  271.     ComponentResult err = noErr;
  272.  
  273.     if (cr->confComponent)
  274.         CloseComponent(cr->confComponent);
  275.         
  276.     cr->confComponent = nil;
  277.     cr->conference = 0;
  278.     
  279.     MTControllerDoAction(cr->controller, mtControllerActionPlay, &aTrue);
  280.         
  281.     cr->casting = false;
  282.     
  283.     return err;
  284. }
  285.  
  286. /*************************************************** 
  287.  CopyCast 
  288. ****************************************************/
  289. ComponentResult CopyCast( CastRecord* cr, PicHandle* pic ) {
  290.  
  291.     ComponentResult err;
  292.     
  293.     err =  MTControllerSnapshot(cr->controller, pic );
  294.  
  295.     return noErr;
  296. }
  297.  
  298. /*************************************************** 
  299.  IsCasting 
  300. ****************************************************/
  301. Boolean IsCasting( CastRecord* cr ) {
  302.     return cr->casting;    
  303. }
  304.  
  305. /*************************************************** 
  306.  SetupSequenceGrabber 
  307. ****************************************************/
  308. ComponentResult SetupSequenceGrabber( SeqGrabComponent* sg, 
  309.                                       SGChannel* soundChannel, 
  310.                                       SGChannel* videoChannel,  
  311.                                       UserData settings ) {
  312.     ComponentResult     err = noErr;
  313.     SeqGrabComponent     grabber = nil;
  314.  
  315.     *soundChannel = nil;
  316.     *videoChannel = nil;
  317.     
  318.     grabber = OpenDefaultComponent( SeqGrabComponentType, 0);
  319.     
  320.     if (grabber == nil) {
  321.         err = couldntGetRequiredComponent;
  322.         }
  323.     else {
  324.         err = SGInitialize(grabber);
  325.         if (err == noErr) {
  326.             if (settings)
  327.                 {
  328.                 err = SGSetSettings( grabber, settings, 0 );
  329.                 
  330.                 if (err == noErr)
  331.                     {
  332.                     /* once the settings are set...
  333.                        figure out what the channels are, 
  334.                         assuming maximum one video and one sound */
  335.                     SGChannel chan;
  336.                     OSType      type;
  337.                     err = SGGetIndChannel(grabber, 1, &chan, &type);
  338.                     if (err == noErr) {
  339.                         if (type == VideoMediaType)
  340.                             *videoChannel = chan;
  341.                         if (type == SoundMediaType)
  342.                             *soundChannel = chan;
  343.                          err = SGGetIndChannel(grabber, 2, &chan, &type);
  344.                         if (err == noErr) {
  345.                             if (type == VideoMediaType)
  346.                                 *videoChannel = chan;
  347.                             if (type == SoundMediaType)
  348.                                 *soundChannel = chan;
  349.                             }
  350.                         }
  351.                     }
  352.                 }
  353.             else { 
  354.                 err = SGNewChannel(grabber, SoundMediaType, soundChannel);
  355.                 if (err == noErr)
  356.                     SGSetChannelUsage(*soundChannel, seqGrabPreview+seqGrabRecord);
  357.                 
  358.                 err = SGNewChannel(grabber, VideoMediaType, videoChannel);
  359.                 if (err == noErr) {
  360.                     SGSetFrameRate(*videoChannel, 0);
  361.                     SGSetVideoCompressorType(*videoChannel, 'rpza');
  362.                     SGSetChannelUsage(*videoChannel, 
  363.                                         seqGrabPreview +
  364.                                         seqGrabRecord +
  365.                                         seqGrabPlayDuringRecord);
  366.                     }
  367.                     
  368.                 /* reset if we had a problem opening 
  369.                    a channel (like there was no digitizer...) */
  370.                 err = noErr;
  371.                 }
  372.             }
  373.         }
  374.         
  375.     if (err) {
  376.         if (grabber)
  377.             CloseComponent(grabber);
  378.         grabber = nil;
  379.         }
  380.     
  381.     *sg = grabber;
  382.  
  383.     return err;
  384. }
  385.  
  386.  
  387. /*************************************************** 
  388.  MyControllerActionFilter 
  389. ****************************************************/
  390. pascal Boolean     MyControllerActionFilter(MTControllerComponent mtc, 
  391.                                          MTControllerActionType action, 
  392.                                          void* params, long refCon ) {
  393.     void*        unused1 = params;
  394.     long        unused2 = refCon;
  395.     Boolean     handled = false;
  396.     WindowPtr    controllerWindow = (WindowPtr)MTControllerGetControllerPort(mtc);
  397.     Rect        box;
  398.  
  399.     switch (action)
  400.         {
  401.         case mtControllerActionControllerSizeChanged:
  402.             /* find out how big the controller is */
  403.             MTControllerGetControllerBoundsRect(mtc, &box);
  404.             /* resize the window accordingly */
  405.             SizeWindow ( controllerWindow, box.right, box.bottom, true);
  406.             break;
  407.             
  408.         case mtControllerActionStreamsChanged:
  409.              MTControllerDoAction(mtc, mtControllerActionPlay, &aTrue);
  410.              break;
  411.  
  412.         default:
  413.             break;
  414.         }
  415.         
  416.     return handled;
  417. }
  418.  
  419. /*************************************************** 
  420.  CastChannelSettings 
  421. ****************************************************/
  422. ComponentResult CastChannelSettings( CastRecord* cr,  SGChannel channel ) {
  423.  
  424.     ComponentResult err = noErr;
  425.     
  426.     err = MTControllerChangedStreams(cr->controller, false);
  427.     
  428.     if (err == noErr) {
  429.         err = SGSettingsDialog(cr->sg, channel, 0, nil, 0, nil, nil);
  430.         MTControllerChangedStreams( cr->controller, true );
  431.         }
  432.         
  433.     return err;
  434. }
  435.